{ "cells": [ { "cell_type": "markdown", "id": "f3768eba", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# Getting Started with PauliwordOp" ] }, { "cell_type": "markdown", "id": "09fc3eff-9766-4869-b97e-297f491ed7ca", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The Pauli spin matrices $\\{X, Y, Z, I \\}$ are defined as:\n", "\n", "$$X = \\begin{bmatrix}\n", "0 & 1\\\\ \n", "1 & 0\n", "\\end{bmatrix}$$\n", "\n", "$$Y = \\begin{bmatrix}\n", "0 & -1i\\\\ \n", "1i & 0\n", "\\end{bmatrix}$$\n", "\n", "$$Z = \\begin{bmatrix}\n", "1 & 0\\\\ \n", "0 & -1\n", "\\end{bmatrix}$$\n", "\n", "$$I = \\begin{bmatrix}\n", "1 & 0\\\\\n", "0 & 1\n", "\\end{bmatrix}$$\n", "\n", "A Pauli operator $P_{i}$ is defined as an $n$-fold tensor products of such single qubit Pauli matrices. We can write this as:\n", "\n", "$$P_{i} = \\bigotimes_{k=0}^{n-1} \\sigma_{k} = \\sigma_{0} \\otimes \\sigma_{1} \\otimes ... \\otimes \\sigma_{n-1}$$\n", "\n", "where $\\sigma \\in \\{X, Y, Z, I \\}$ and the subscript $k$ indexes the qubit the Pauli matrix acts on.\n" ] }, { "cell_type": "markdown", "id": "df1b548e-3fac-4e62-8f50-c74d6ced86c6", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The `PauliwordOp` class is used to describe arbitrary linear combination of Pauli operators and provide useful manipulation functions." ] }, { "cell_type": "markdown", "id": "6aa1b796-f746-417d-8ba3-cbb306aec601", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "## Initialization" ] }, { "cell_type": "markdown", "id": "e15871ad-3dc0-44d8-93a4-de766fd1fbae", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "First we need to import `PauliwordOp`" ] }, { "cell_type": "code", "execution_count": 1, "id": "b8b96530-dc5a-42af-8324-c99af619daa1", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/lex/anaconda3/envs/symmer_github/lib/python3.9/site-packages/cotengra/hyperoptimizers/hyper.py:34: UserWarning: Couldn't import `kahypar` - skipping from default hyper optimizer and using basic `labels` method instead.\n", " warnings.warn(\n" ] } ], "source": [ "from symmer import PauliwordOp" ] }, { "cell_type": "markdown", "id": "342e9dce-b578-4963-97c4-fd915fc1795c", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can then initialize a Pauli operator via the following methods:\n", "1. `from_list`\n", "2. `from_dictionary`\n", "3. `from_matrix`\n", "4. `random`\n", "5. `haar_random`\n", "6. `from_qiskit`\n", "7. `from_openfermion`\n", "8. `empty`" ] }, { "cell_type": "code", "execution_count": 2, "id": "88499054", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j ZI +\n", " 2.000+0.000j ZZ +\n", " 3.000+0.000j ZX +\n", " 4.000+0.000j YZ +\n", " 5.000+0.000j XX +\n", " 6.000+0.000j XY" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_list = ['ZI', 'ZZ', 'ZX', 'YZ', 'XX', 'XY']\n", "coeffs = [1,2,3,4,5,6]\n", "\n", "PauliwordOp.from_list(term_list,\n", " coeffs)" ] }, { "cell_type": "code", "execution_count": 3, "id": "eff541ba", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j ZI +\n", " 2.000+0.000j ZZ +\n", " 3.000+0.000j ZX +\n", " 4.000+0.000j YZ +\n", " 5.000+0.000j XX +\n", " 6.000+0.000j XY" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_dict = {'ZI': (1+0j),\n", " 'ZZ': (2+0j),\n", " 'ZX': (3+0j),\n", " 'YZ': (4+0j),\n", " 'XX': (5+0j),\n", " 'XY': (6+0j)}\n", " \n", "PauliwordOp.from_dictionary(term_dict)" ] }, { "cell_type": "markdown", "id": "a757330e", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "The `from_matrix` has two methods:\n", "- projector: builds operator by matrix elements\n", "- full_basis: builds operator by searching over basis of Pauli operators (size $4^{n}$)" ] }, { "cell_type": "code", "execution_count": 4, "id": "6e491a1a", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j ZI +\n", " 2.000+0.000j ZZ +\n", " 3.000+0.000j ZX +\n", " 4.000+0.000j YZ +\n", " 5.000+0.000j XX +\n", " 6.000+0.000j XY" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "mat = np.array([[ 3.+0.j, 3.+0.j, 0.-4.j, 5.-6.j],\n", " [ 3.+0.j, -1.+0.j, 5.+6.j, 0.+4.j],\n", " [ 0.+4.j, 5.-6.j, -3.+0.j, -3.+0.j],\n", " [ 5.+6.j, 0.-4.j, -3.+0.j, 1.+0.j]])\n", "\n", "PauliwordOp.from_matrix(mat, \n", " strategy='projector',\n", " disable_loading_bar=True)" ] }, { "cell_type": "code", "execution_count": 5, "id": "ac1218be", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a051bf4d42e54228b8a0136036e7d79a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Building operator via full basis: 0%| | 0/16 [00:00\n", " (0, 0)\t(5+1j)\n", " (0, 3)\t(1+0j)\n", " (1, 1)\t(1-1j)\n", " (1, 2)\t(1+0j)\n", " (2, 1)\t(1+0j)\n", " (2, 2)\t(1-1j)\n", " (3, 0)\t(1+0j)\n", " (3, 3)\t(5+1j)\n" ] } ], "source": [ "op_sparse_matrix = op.to_sparse_matrix\n", "\n", "print(type(op_sparse_matrix))\n", "print(op_sparse_matrix)" ] }, { "cell_type": "markdown", "id": "f25ff0a2", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We can use the `toarray` of `scipy.sparse._csr.csr_matrix` to make this a dense matrix" ] }, { "cell_type": "code", "execution_count": 23, "id": "86b0ed7a", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[5.+1.j 0.+0.j 0.+0.j 1.+0.j]\n", " [0.+0.j 1.-1.j 1.+0.j 0.+0.j]\n", " [0.+0.j 1.+0.j 1.-1.j 0.+0.j]\n", " [1.+0.j 0.+0.j 0.+0.j 5.+1.j]]\n" ] } ], "source": [ "print(op_sparse_matrix.toarray())" ] }, { "cell_type": "markdown", "id": "1c2a88b2", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We tabulate the operator into a pandas dataframe (`pandas.core.frame.DataFrame`)" ] }, { "cell_type": "code", "execution_count": 24, "id": "6bd2f698", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pauli termsCoefficients (real)Coefficients (imaginary)
0II1.00.0
1ZZ2.01.0
2XX3.00.0
\n", "
" ], "text/plain": [ " Pauli terms Coefficients (real) Coefficients (imaginary)\n", "0 II 1.0 0.0\n", "1 ZZ 2.0 1.0\n", "2 XX 3.0 0.0" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataframe = op.to_dataframe\n", "dataframe" ] }, { "cell_type": "markdown", "id": "f86c1fe3", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We can also output the operator to different backends such as to openfermion:" ] }, { "cell_type": "code", "execution_count": 25, "id": "85549b95", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "(3+0j) [] +\n", "(1+0j) [X0 X1] +\n", "(2+1j) [Z0 Z1]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "op.to_openfermion" ] }, { "cell_type": "markdown", "id": "72905b1b", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "and qiskit:" ] }, { "cell_type": "code", "execution_count": 26, "id": "6113600d", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "SparsePauliOp(['XX', 'ZZ', 'II'],\n", " coeffs=[1.+0.j, 2.+1.j, 3.+0.j])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "op.to_qiskit" ] }, { "cell_type": "markdown", "id": "1cde8e4e", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "and to a simple dictionary:" ] }, { "cell_type": "code", "execution_count": 27, "id": "3d787c24", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'II': (3+0j), 'ZZ': (2+1j), 'XX': (1+0j)}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "op.to_dictionary" ] }, { "cell_type": "code", "execution_count": null, "id": "722a8c60", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "3ddbb2ef-9edf-4144-b7ac-d4987ce9dff0", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "PauliwordOp also has graph functionality:\n", "1. Nodes / Vertices are used to represent Pauli operators\n", "2. Edges are used to represent a defined commutation relation between Pauli operators" ] }, { "cell_type": "code", "execution_count": 28, "id": "a2231fb5", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "op = PauliwordOp.from_dictionary({\n", " 'III': (0.44635739706240757+0j),\n", " 'IZI': (-1.3319405851037809+0j),\n", " 'IZZ': (1.0470696736027791+0j),\n", " 'ZIY': (-0.05713271668152262+0j),\n", " 'ZXI': (0.8028744054919319+0j),\n", " 'IXX': (0.24469102625407302+0j),\n", " 'YII': (-0.3680101467816112+0j),\n", " 'YIX': (1.2592176764100222+0j)})" ] }, { "cell_type": "code", "execution_count": 29, "id": "36aa0dac", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import networkx as nx\n", "\n", "Graph = op.get_graph(edge_relation='C', # <- can change to ['AC', 'QWC']\n", " label_nodes=True)\n", "\n", "nx.draw(Graph,\n", " with_labels = True,\n", " alpha=0.75,\n", " node_color=\"skyblue\",\n", " width=0.1,\n", " node_size=750\n", " )" ] }, { "cell_type": "code", "execution_count": 30, "id": "a15395bf", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 0.446+0.000j III +\n", "-0.057+0.000j ZIY +\n", " 0.803+0.000j ZXI, 1: -1.332+0.000j IZI +\n", " 1.047+0.000j IZZ +\n", "-0.368+0.000j YII, 2: 0.245+0.000j IXX +\n", " 1.259+0.000j YIX}\n" ] } ], "source": [ "dict_of_cliques = op.clique_cover(edge_relation='C')\n", "print(dict_of_cliques)" ] }, { "cell_type": "markdown", "id": "942a2126", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "Try the above functions, but change edge relation to one of: \n", "- `C` = Pauli operators in clique must commute\n", "- `AC` = Pauli operators in clique must anticommute\n", "- `QWC` = Pauli operators in clique must qubitwise commute" ] }, { "cell_type": "code", "execution_count": null, "id": "b7e38560", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "65dd5b73", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We can also get the generators for a Pauli operator. For example:" ] }, { "cell_type": "code", "execution_count": 31, "id": "93d0bcb0", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "P = PauliwordOp.from_dictionary({\n", "'III': (1+0j),\n", " 'IIZ': (1+0j),\n", " 'IZI': (1+0j),\n", " 'IZZ': (1+0j),\n", " 'ZII': (1+0j),\n", " 'ZIZ': (1+0j),\n", " 'ZZI': (1+0j),\n", " 'ZZZ': (1+0j),\n", " 'IIX': (1+0j),\n", " 'IXI': (1+0j),\n", " 'IXX': (1+0j),\n", " 'XII': (1+0j),\n", " 'XIX': (1+0j),\n", " 'XXI': (1+0j),\n", " 'XXX': (1+0j)})\n" ] }, { "cell_type": "markdown", "id": "ce73b7d1", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "has the following generators:" ] }, { "cell_type": "code", "execution_count": 32, "id": "9d7d0292", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j IIZ +\n", " 1.000+0.000j IZI +\n", " 1.000+0.000j ZII +\n", " 1.000+0.000j IIX +\n", " 1.000+0.000j IXI +\n", " 1.000+0.000j XII" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P.generators" ] }, { "cell_type": "markdown", "id": "2d5caf42", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We can get the Hermitian conjugate of an operator by using the `dagger`" ] }, { "cell_type": "code", "execution_count": 33, "id": "9d436161", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1.000+0.000j XX +\n", " 2.000+1.000j ZZ +\n", " 3.000-4.000j YY\n", "\n", " 1.000-0.000j XX +\n", " 2.000-1.000j ZZ +\n", " 3.000+4.000j YY\n" ] } ], "source": [ "op = PauliwordOp.from_dictionary(\n", " {\n", " 'XX':1,\n", " 'ZZ':2 + 1j,\n", " 'YY':3 - 4j\n", " }\n", ")\n", "print(op)\n", "print()\n", "print(op.dagger)" ] }, { "cell_type": "markdown", "id": "a44c860c", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%% md\n" } }, "source": [ "We can use this to show a Haar random unitary is in fact unitary:" ] }, { "cell_type": "code", "execution_count": 34, "id": "6fc9dc51", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j II" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_qubits= 2\n", "haar_random = PauliwordOp.haar_random(n_qubits, \n", " disable_loading_bar=True)\n", "\n", "haar_random * haar_random.dagger" ] }, { "cell_type": "markdown", "id": "55f4664c-87ca-4d8f-b8ce-848e7a7f2843", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can get the Hermitian conjugate of an operator by using the `dagger`" ] }, { "cell_type": "code", "execution_count": 35, "id": "bec8807c-e91d-4ce7-9ffd-0af842a77a18", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1.000+0.000j XX +\n", " 2.000+1.000j ZZ +\n", " 3.000-4.000j YY\n", "\n", " 1.000-0.000j XX +\n", " 2.000-1.000j ZZ +\n", " 3.000+4.000j YY\n" ] } ], "source": [ "op = PauliwordOp.from_dictionary(\n", " {\n", " 'XX':1,\n", " 'ZZ':2 + 1j,\n", " 'YY':3 - 4j\n", " }\n", ")\n", "print(op)\n", "print()\n", "print(op.dagger)" ] }, { "cell_type": "markdown", "id": "e3291b7a-901c-41c9-ba09-21727d659c2f", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can use this to show a Haar random unitary is in fact unitary:" ] }, { "cell_type": "code", "execution_count": 36, "id": "149a6df1-8d99-40a3-a655-34d7ae893c64", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ " 1.000+0.000j II" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_qubits= 2\n", "haar_random = PauliwordOp.haar_random(n_qubits, \n", " disable_loading_bar=True)\n", "\n", "haar_random * haar_random.dagger" ] }, { "cell_type": "markdown", "id": "fd45582b-9f9b-41c0-b682-2337dea9eeb0", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "## Attributes" ] }, { "cell_type": "markdown", "id": "e41f355f-2bc0-40cd-957a-3a4b69149de3", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Note the number of significant figures a Pauli operator is reported too by default is **3**:" ] }, { "cell_type": "code", "execution_count": 37, "id": "9aea1941-e1f3-4d90-92de-66c2c6b2ef84", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.000+0.000j XX +\n", " 0.000+0.000j ZZ\n" ] } ], "source": [ "P = PauliwordOp.from_dictionary(\n", " {\n", " 'XX': 0.0001,\n", " 'ZZ': 0.0001j,\n", " }\n", ")\n", "print(P)" ] }, { "cell_type": "markdown", "id": "fde9ff6e-40d5-4218-a023-91b2abce6cc6", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "in order to increase this we need in increase `sigfig` attribute:" ] }, { "cell_type": "code", "execution_count": 38, "id": "7cf332a5-cf05-4098-9403-1d55c1a933a7", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.00010+0.00000j XX +\n", " 0.00000+0.00010j ZZ\n" ] } ], "source": [ "P.sigfig= 5\n", "print(P)" ] }, { "cell_type": "markdown", "id": "87674de5-07f9-4c94-87c0-7a7d3999b82e", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can also access the coefficients of each Pauli operator via the coeff_vec attribute" ] }, { "cell_type": "code", "execution_count": 39, "id": "2fe1b460-74f5-428a-a41a-f49b4f85153d", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.0001+0.j 0. +0.0001j]\n" ] } ], "source": [ "print(P.coeff_vec)" ] }, { "cell_type": "markdown", "id": "7eb88e73-db59-40e0-9472-b4c455e187b0", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "That returns a numpy array" ] }, { "cell_type": "code", "execution_count": null, "id": "3ead89e2", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.18" } }, "nbformat": 4, "nbformat_minor": 5 }